﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace AutoPlayMedia
{
    public partial class PlayMedia : Form
    {
        List<string> lstLineMusic =  new List<string>();
        List<Music> _lstMusic = new List<Music>();
        Dictionary<string, string> dicTimeInDay = new Dictionary<string, string>(){
	        {"T2", ""},
	        {"T3", ""},
	        {"T4", ""},
	        {"T5", ""},
            {"T6", ""},
            {"T7", ""},
            {"CN", ""}
	    };
        Dictionary<string, string> dayOfWeek = new Dictionary<string, string>()
        {
            {"Mon", "T2"},
            {"Tue", "T3"},
            {"Wed", "T4"},
            {"Thu", "T5"},
            {"Fri", "T6"},
            {"Sat", "T7"},
            {"Sun", "CN"},
        };

        public PlayMedia()
        {
            InitializeComponent();

            //Load file
            loadMusic();

            //set load sau 1'
            loadEachMinute();
            // Mở nhạc thời gian đã lưu
            //openMusic();

            // create Time Digital;
            createTimeDigital();
        }
        private void loadEachMinute()
        {
            Timer t = new Timer();
            // t Interval
            t.Interval = 60000; // in miliseconds
            t.Tick += new EventHandler(this.openMusic);

            // start time when form load
            t.Start();
        }

        // Tự động mở nhạc theo thời gian đặt trước
        private void openMusic(object sender, EventArgs e)
        {
            DateTime timeNow = System.DateTime.Now;
            string ss = (timeNow.Hour < 10 ? "0" + timeNow.Hour : timeNow.Hour.ToString()) + ":" + (timeNow.Minute < 10 ? "0" + timeNow.Minute : timeNow.Minute.ToString());
            //MessageBox.Show(ss);
            string day = timeNow.DayOfWeek.ToString().Substring(0, 3);
            string dayVN = dayOfWeek[day];
            List<Music> lMusic = new List<Music>();
            foreach (Music music in _lstMusic)
            {
                if (music.dicTimeInDay[dayVN] != "")
                {
                    lMusic.Add(music);
                }
                //else
                //{
                //    _lstMusic.Remove(music);
                //}
            }
            // MessageBox.Show("Today is : " + day);
            //            MessageBox.Show("Today is : " + lMusic.Count);
            // tạo lại danh sách ngày hiện tại
            // clear danh sách Nhạc
            lstMusic.Items.Clear();

            // tạo danh sách list để lưu trữ danh sách bài hát
            WMPLib.IWMPPlaylist playList = media.newPlaylist("My play list", string.Empty);
            _lstMusic = new List<Music>();
            foreach (Music music in lMusic)
            {
                // lấy ra thời gian của ngày hiện tại
                string[] times = music.dicTimeInDay[dayVN].Split(';');
                foreach (string timeItem in times)
                {
                    // cắt chuỗi lấy khoảng thời gian h:m
                    string ssTime = timeItem.Substring(0, 5);
                    // MessageBox.Show(ss + " --- " + ssTime);
                    // so sánh nếu thời gian đã lưu với thời gian hiện tại
                    if (string.Compare(ss, ssTime, true) == 0)
                    {
                        WMPLib.IWMPMedia pMedia = media.newMedia(music.url);
                        playList.appendItem(pMedia);

                        // add vào list danh sách hiển thị
                        lstMusic.Items.Add(music.name);

                        // add vào danh sách global
                        // lstLineMusic.Add(line);
                        _lstMusic.Add(music);
                    }
                }
            }
            // mở media với danh sách vừa tạo
            media.currentPlaylist = playList;
            // tự động play
            media.Ctlcontrols.play();
            media.settings.autoStart = true;
            // lặp lại bài hát
            //media.settings.setMode("loop", true);
        }

        // Tạo đồng hồ điện tử
        private void createTimeDigital()
        {
            Timer t = new Timer();
            // t Interval
            t.Interval = 1000; // in miliseconds
            t.Tick += new EventHandler(this.t_Tick);

            // start time when form load
            t.Start();
        }
        // time eventhandler
        private void t_Tick(object sender, EventArgs e)
        {
            //get current time
            int hh = DateTime.Now.Hour;
            int mm = DateTime.Now.Minute;
            int ss = DateTime.Now.Second;

            //time
            string time = "";

            //padding leading zero
            if (hh < 10)
            {
                time += "0" + hh;
            }
            else
            {
                time += hh;
            }
            time += ":";

            if (mm < 10)
            {
                time += "0" + mm;
            }
            else
            {
                time += mm;
            }
            time += ":";

            if (ss < 10)
            {
                time += "0" + ss;
            }
            else
            {
                time += ss;
            }

            //update label
            lblDigitalClock.Text = time;
        }
        private void loadMusic()
        {
            // Mở file để đọc
            FileStream fs = File.OpenRead("MyPlayList.txt");
            StreamReader sr = new StreamReader(fs);
            string line = "";
            int count = 0;
            // clear danh sách Nhạc
            lstMusic.Items.Clear();

            // khởi tạo lại list nhạc
            _lstMusic = new List<Music>();

            // tạo danh sách list để lưu trữ danh sách bài hát
            WMPLib.IWMPPlaylist playList = media.newPlaylist("My play list", string.Empty);
            while ((line = sr.ReadLine()) != null)
            {
                string[] lines = line.Split('|');
                WMPLib.IWMPMedia pMedia = media.newMedia(lines[1]);
                playList.appendItem(pMedia);

                // add vào list danh sách hiển thị
                lstMusic.Items.Add(lines[2]);

                // add vào danh sách global
                lstLineMusic.Add(line);

                // add list Music class
                Music music = new Music(count, lines[1], lines[2], lines[3]);
                _lstMusic.Add(music);

                count++;


            }
            sr.Close();
            fs.Close();
            // mở media với danh sách vừa tạo
            media.currentPlaylist = playList;
            // tự động play
            media.Ctlcontrols.play();
            media.settings.autoStart = true;
            // lặp lại bài hát
            media.settings.setMode("loop", true);

            // lấy ra url của đường dẫn đầu tiên
            string[] strLine = lstLineMusic[0].Split('|');
            if (strLine.Length > 0)
            {
                // set text cho URL
                txtURL.Text = strLine[0];
                string []urls = strLine[0].Split('\\');
                txtName.Text = urls[urls.Length - 1];
                if (strLine.Length > 1)
                {
                    string[] days = strLine[1].Split(';');
                    // set checked cho Ngày trong tuần
                    foreach (string day in days)
                    {
                      //  chkDayOfWeek.SetItemChecked(Convert.ToInt32(day), true);
                    }
                }
                if (strLine.Length > 2)
                {
                    // set text cho Giờ - Phút
                    string[] times = strLine[2].Split(':');
                   // txtHour.Text = times[0];
                    //txtMinute.Text = times[1];
                }
                if (strLine.Length > 3)
                {
                    // set số lần repeat
                    //txtRepeatNumber.Text = strLine[3];
                }
            }
        }

        private void fillToListTime()
        {

        }
        private void openFileToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // mở chọn thư mục bài hát
            OpenFileDialog openDialog = new OpenFileDialog();
            // chọn nhiều bài hát
            openDialog.Multiselect = true;
            // filer : mp3
            openDialog.Filter = "MP3|*.mp3";
            //
            lstMusic.Items.Clear();
            // if chọn OK
            if (openDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                //media.URL = openDialog.FileName;
                // tạo danh sách list để lưu trữ danh sách bài hát
                WMPLib.IWMPPlaylist playList = media.newPlaylist("My play list", string.Empty);
                int count = 0;
                // duyệt danh sanh bài hát
                foreach (string file in openDialog.FileNames)
                {
                    // add từng bài hát vào danh sách
                    WMPLib.IWMPMedia pMedia = media.newMedia(file);
                    playList.appendItem(pMedia);

                    // add vào list danh sách hiển thị
                    //lstMusic.Items.Add(file);
                    lstMusic.Items.Add(openDialog.SafeFileNames[count]);
                    
                    // add vào danh sách class
                    Music aMusic = new Music(count, file, openDialog.SafeFileNames[count], "");
                    _lstMusic.Add(aMusic);

                    count++;
                }
                MessageBox.Show("số bài hát : " + _lstMusic.Count.ToString());
                // mở media với danh sách vừa tạo
                media.currentPlaylist = playList;
                // lấy ra name của đường dẫn đầu tiên
                txtName.Text = lstMusic.Items[0].Text;
                // lấy ra url của đường dẫn đầu tiên
                txtURL.Text = _lstMusic[0].url;
                // tự động play
                media.Ctlcontrols.play();
                media.settings.autoStart = true;
                // lặp lại bài hát
                media.settings.setMode("loop", true);
            }
        }

        // chạy bài hát khi được chọn trong danh sách
        private void lstMusic_SelectedIndexChanged(object sender, EventArgs e)
        {
            // set đường dẫn để play music
            /*media.URL = lstMusic.FocusedItem.Text;
            txtURL.Text = lstMusic.FocusedItem.Text;*/
            media.URL = _lstMusic[lstMusic.FocusedItem.Index].url;
            txtURL.Text = _lstMusic[lstMusic.FocusedItem.Index].url;
            txtName.Text = lstMusic.FocusedItem.Text;

            // lấy ra chỉ số index hiện tại đang chọn
            int index = lstMusic.FocusedItem.Index;
            // đổ dữ liệu thời gian từ bài hát được chọn hiện tại -> dicTimeInDay
            dicTimeInDay = new Dictionary<string, string>();
            // lấy ra danh sách thời gian của 1 bài hát được chọn
            dicTimeInDay = _lstMusic[index].dicTimeInDay;
            // cài đặt mặc định dữ liệu khi load
            resetTime(txtTimeHour, txtTimeMinute, txtTimeRepeatNumber, lstViewTime);
            //MessageBox.Show(dicTimeInDay.Count.ToString());
        }

        // lưu danh sách bài hát vào file "MyPlayList.txt"
        private void saveListToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // lưu dữ liệu vào file
            saveToFile();
        }

        // Load danh sách bài hát từ file "MyPlayList.txt"
        private void loadListToolStripMenuItem_Click(object sender, EventArgs e)
        {
            // Mở file để đọc
            FileStream fs = File.OpenRead("MyPlayList.txt");
            StreamReader sr = new StreamReader(fs);
            string line = "";

            // clear danh sách Nhạc
            lstMusic.Items.Clear();
            // tạo danh sách list để lưu trữ danh sách bài hát
            WMPLib.IWMPPlaylist playList = media.newPlaylist("My play list", string.Empty);
            int count = 0;
            // reset lại class _lstMusic
            _lstMusic = new List<Music>();
            while((line = sr.ReadLine()) != null)
            {
                string[] lines = line.Split('|');
                WMPLib.IWMPMedia pMedia = media.newMedia(lines[1]);
                playList.appendItem(pMedia);

                // add vào list danh sách hiển thị
                lstMusic.Items.Add(lines[2]);

                // add vào danh sách class
                Music music = new Music(count, lines[1], lines[2], lines[3]);
                _lstMusic.Add(music);

                count++;
            }
            //MessageBox.Show(_lstMusic.Count.ToString());
            sr.Close();
            fs.Close();
            // mở media với danh sách vừa tạo
            media.currentPlaylist = playList;
            if (_lstMusic.Count > 0 && lstMusic.Items.Count > 0)
            {
                // lấy ra name của đường dẫn đầu tiên
                txtName.Text = lstMusic.Items[0].Text;
                // lấy ra url của đường dẫn đầu tiên
                txtURL.Text = _lstMusic[0].url;
            }
            // tự động play
            media.Ctlcontrols.play();
            media.settings.autoStart = true;
            // lặp lại bài hát
            media.settings.setMode("loop", true);
        }

        private void setTimeForEachSingleToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //grMediaPlay.Hide();
            //grSetTimeForEach.Show();
        }
        
        private void btnSave_Click(object sender, EventArgs e)
        {
            if (lstMusic.SelectedItems != null && lstMusic.SelectedItems.Count > 0)
            {
                //txtName.Text = lstMusic.FocusedItem.Index.ToString();
                int index = lstMusic.FocusedItem.Index;
                string name = "";
                if (_lstMusic[index].name != "")
                    name = _lstMusic[index].name;

                // mon - sun
                string time = "";
                // duyệt qua tất cả tab page
                foreach (Control tab in tabDayOfWeek.Controls)
                {
                    TabPage tabPage = (TabPage)tab;
                    if (time != "")
                    {
                        time += ";";
                    }
                    // lấy ra thời gian của từng tab page
                    time += getTimeOfDay(tabPage);
                }

                //
                //_lstMusic[index].name = name;
                _lstMusic[index].time = time;

                // Lưu lại toàn bộ dữ liệu vào File
                saveToFile();

                MessageBox.Show("time : " + time);
            }
            else
            {
                MessageBox.Show("Mời chọn bài hát để đặt thời gian !");
            }
        }

        /*********** My Function *************/
        // trả về chuỗi thời gian theo 1 ngày
        private string getTimeOfDay(TabPage tab)
        {
            string strTime = tab.Text + "#";
            strTime += dicTimeInDay[tab.Text];

            return strTime;
        }
        // reset các trường giờ - phút - number
        private void resetTime(TextBox h, TextBox m, TextBox n)
        {
            h.Text = "0";
            m.Text = "0";
            n.Text = "0";
        }
        // reset các trường giờ - phút - number - list View Time
        private void resetTime(TextBox h, TextBox m, TextBox n, ListView lstView)
        {
            h.Text = "0";
            m.Text = "0";
            n.Text = "0";
            //xóa danh sách hiện tại
            lstView.Items.Clear();
            // lấy ra tên tab đang được selected
            string nameTab = tabDayOfWeek.SelectedTab.Text;
            if (dicTimeInDay[nameTab] != "")
            {
                //Lấy ra mảng thời gian theo từng ngày
                string []strTime = dicTimeInDay[nameTab].Split(',');
                // nếu danh sách thời gian nhiều hơn 1
                if (strTime.Length > 1)
                {
                    // add danh sách thời gian vào list theo ngày trong tuần
                    foreach (string item in strTime)
                    {
                        // add vào danh sách hiển thị theo từng ngày
                        lstView.Items.Add(item);
                    }
                }
                // nếu danh sách thời gian == 1
                else if (strTime.Length == 1)
                {
                    lstView.Items.Add(strTime[0]);
                }

            }
        }
        // set enable = true/false cho các trường Giờ - Phút - Number
        private void isEnable(TextBox h, TextBox m, TextBox n, bool isTrue)
        {
            // enabled các trường nhập
            h.Enabled = isTrue;
            m.Enabled = isTrue;
            n.Enabled = isTrue;
        }

        // set dữ liệu cho các trường Giờ - Phút - Number
        private void setTime(TextBox h, TextBox m, TextBox n, string strHour, string strMinute, string strRepeatNumber)
        {
            h.Text = strHour;
            m.Text = strMinute;
            n.Text = strRepeatNumber;
        }

        private string getStringTime(TextBox h, TextBox m, TextBox n, ListView lstView)
        {
            string time = "";
            string hour = h.Text;
            string minute = m.Text;
            string repeatNubmer = n.Text;

            int Num;
            bool isNum = int.TryParse(hour, out Num);
            // kiểm tra dữ liệu đúng mới add
            bool isCorrect = true;

            // kiểm tra giờ 
            if (!isNum)
            {
                MessageBox.Show("Giờ phải là số");
                txtTimeHour.Focus();
                isCorrect = false;
            }
            else if (isNum && Convert.ToInt32(hour) > 23)
            {
                MessageBox.Show("Giờ không được lớn hơn 23");
                txtTimeHour.Focus();
                isCorrect = false;
            }

            // kiểm tra phút 
            isNum = int.TryParse(minute, out Num);
            if (!isNum)
            {
                MessageBox.Show("Phút phải là số");
                txtTimeMinute.Focus();
                isCorrect = false;
            }
            else if (isNum && Convert.ToInt32(minute) > 59)
            {
                MessageBox.Show("Phút không được lớn hơn 59");
                txtTimeMinute.Focus();
                isCorrect = false;
            }

            // kiểm tra số lặp
            isNum = int.TryParse(repeatNubmer, out Num);
            if (!isNum)
            {
                MessageBox.Show("Số lần phải là số");
                txtTimeRepeatNumber.Focus();
                isCorrect = false;
            }

            // nếu giờ - phút - số lặp -> ĐÚNG
            if (isCorrect)
            {
                // thời gian : Giờ + phút
                time = (hour.Length == 1 ? "0" + hour : hour) + ":" + (minute.Length == 1 ? "0" + minute : minute);

                // add vào list danh sách hiển thị
                bool isExist = false;
                foreach (ListViewItem item in lstView.Items)
                {
                    string[] strTime = item.Text.Split('-');
                    if (time == strTime[0])
                    {
                        isExist = true;
                    }
                }
                if (isExist)
                {
                    MessageBox.Show("Thời gian này đã có trong danh sách");
                }
                else if (!isExist || lstView.Items.Count == 0)
                {
                    time += "-" + repeatNubmer;
                    return time;
                }
            }

            return "";

        }
        private void addTimeToListView(TextBox h, TextBox m, TextBox n, ListView lstView)
        {
            string sTime = getStringTime(h, m, n, lstView);
            if (sTime != "")
            {
                // add vào danh sách thời gian
                lstView.Items.Add(sTime);

                // reset giờ - phút - số lần lặp
                resetTime(h, m, n);
                // mở các trường nhập
                isEnable(h, m, n, true);
            }
        }
        private void selectChangeListViewTime(TextBox h, TextBox m, TextBox n, ListView lstView)
        {
            string[] strTimeItem = lstView.FocusedItem.Text.Split('-');
            if (strTimeItem.Length > 0)
            {
                string[] strTime = strTimeItem[0].Split(':');
                if (strTimeItem.Length > 1)
                    setTime(h, m, n, strTime[0], strTime[1], strTimeItem[1]);
            }
            // khóa các trường nhập
            isEnable(h, m, n, false);
        }

        private void saveToFile()
        {
            // tạo file MyplayList.txt khi chưa có
            if (!File.Exists("MyPlayList.txt"))
            {
                // tạo file
                File.Create("MyPlayList.txt");
            }
            // Mở File , ghi đè dữ liệu
            FileStream fs = File.Open("MyPlayList.txt", FileMode.Create, FileAccess.Write);
            StreamWriter sw = new StreamWriter(fs);
            // ghi dữ liệu vào file
            foreach (Music item in _lstMusic)
            {
                sw.WriteLine(item.PrintMusic());
            }
            sw.Close();
            fs.Close();
            // Hiển thị thông báo khi gửi dữ liệu thành công
            MessageBox.Show("Danh sách đã được lưu thành công");
        }

        /*********** END My Function *************/

        private void tabDayOfWeek_SelectedIndexChanged(object sender, EventArgs e)
        {
            //MessageBox.Show(tabDayOfWeek.SelectedTab.Text);
            // reset giờ - phút - số lần lặp
            resetTime(txtTimeHour, txtTimeMinute, txtTimeRepeatNumber, lstViewTime);
            // mở các trường nhập
            isEnable(txtTimeHour, txtTimeMinute, txtTimeRepeatNumber, true);

            txtTimeHour.Focus();
        }

        private void btnTimeNew_Click(object sender, EventArgs e)
        {
            // reset giờ - phút - số lần lặp
            resetTime(txtTimeHour, txtTimeMinute, txtTimeRepeatNumber, lstViewTime);
            // mở các trường nhập
            isEnable(txtTimeHour, txtTimeMinute, txtTimeRepeatNumber, true);
        }

        private void btnTimeEdit_Click(object sender, EventArgs e)
        {
            // khóa các trường nhập
            isEnable(txtTimeHour, txtTimeMinute, txtTimeRepeatNumber, true);
        }

        private void btnTimeRemove_Click(object sender, EventArgs e)
        {
            // lấy ra tên tab đang được selected
            string nameTab = tabDayOfWeek.SelectedTab.Text;
            string strTime = "";
            foreach (ListViewItem listview in lstViewTime.Items)
            {
                // xóa item khi được chọn
                if (listview.Selected)
                {
                    listview.Remove();
                    continue;
                }

                // hiện thị lại chuỗi thời gian còn lại sau khi xóa
                if (strTime != "")
                {
                    strTime += ",";
                }
                strTime += listview.Text;
            }
            // cập nhật lại dữ liệu vừa xóa
            dicTimeInDay[nameTab] = strTime;
            MessageBox.Show(dicTimeInDay[nameTab]);

            // reset giờ - phút - số lần lặp
            resetTime(txtTimeHour, txtTimeMinute, txtTimeRepeatNumber, lstViewTime);
            // mở các trường nhập
            isEnable(txtTimeHour, txtTimeMinute, txtTimeRepeatNumber, true);
        }

        private void btnTimeSave_Click(object sender, EventArgs e)
        {
            // nếu danh sách thời gian != null (danh cho cập nhật danh sách)
            if (lstViewTime.SelectedItems != null && lstViewTime.SelectedItems.Count > 0)
            {
                // lấy ra chuỗi thời gian trong danh sách
                string sTime = getStringTime(txtTimeHour, txtTimeMinute, txtTimeRepeatNumber, lstViewTime);
                if(sTime != ""){
                    // set lại dữ liệu sau khi cập nhật
                    lstViewTime.SelectedItems[0].Text = sTime;
                }
            }
            else
            {
                // thêm mới thời gian nhập vào danh sách
                addTimeToListView(txtTimeHour, txtTimeMinute, txtTimeRepeatNumber, lstViewTime);
            }

            // lấy ra tên tab đang được selected
            string nameTab = tabDayOfWeek.SelectedTab.Text;
            string strTime = "";
            foreach (ListViewItem listview in lstViewTime.Items)
            {
                if (strTime != "")
                {
                    strTime += ",";
                }
                // lấy ra chuỗi thời gian
                strTime += listview.Text;

            }
            // add dữ liệu thời gian vào trong ngày của tab đang được chọn
            dicTimeInDay[nameTab] = strTime;
            MessageBox.Show(dicTimeInDay[nameTab]);
        }

        private void lstViewTime_SelectedIndexChanged(object sender, EventArgs e)
        {
            selectChangeListViewTime(txtTimeHour, txtTimeMinute, txtTimeRepeatNumber, lstViewTime);
        }

        private void loginToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //this.Hide();
            Login login = new Login();
            login.Show();
        }
        
        

        
        

    }
}
